﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//不能创建临时变量（第三个变量），实现两个数的交换。
//方法一
//int main()
//{
//	int a = 1;
//	int b = 2;
//	a = a + b; //3
//	b = a - b;//1
//	a = a - b;//2
//	printf("%d %d", a, b);
//	system("pause");
//	return 0;
//}
//这种写法缺陷：a b如果很大，求和后的结果超过啦整形的最大值
//方法二
//int main()
//{
//	int a = 1;
//	int b = 2;
//	a = a^b;
//	b = a^b;
//	a = a^b;
//	printf("%d %d\n", a, b);
//
//	system("pause");
//	return 0;
//
//}
//异或操作符特点：a^a=0 0^a=a  按位异或不会产生进位 所以无缺陷
//方法三
//int main()
//{
//	int a = 1;
//	int b = 2;
//	int c = a;
//	a = b;
//	b = c;
//	printf("%d %d\n", a, b);
//	system("pause");
//	return 0;
//}



//求⼀个整数存储在内存中的⼆进制中1的个数(内存中存的都是补码)  
//a&1==1 说明a的二进制中最低位是1 a&1==0 说明a的二进制中最低位是0
//方法一
//int main()
//{
//	int a = 2;
//	int count = 0;
//	for (int i = 0; i < 32; i++)
//	{
//		if (((a >> i) & 1) == 1)
//			count++;
//	}
//	printf("%d\n", count);
//	system("pause");
//	return 0;
//}


//方法二：
//int count_one_bit(unsigned int n)   //unsigned int 将负数失效
//{
//	int count = 0;
//	while (n)
//	{
//		if ((n % 2) == 1)//10-2 除二取余
//			count++;
//		n = n / 2;
//	}
//	return count;
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	//求一个整数存储在内存中的二进制1的个数
//	int n = count_one_bit(num);
//	printf("%d\n", n);
//	system("pause");
//	return 0;
//}

//方法三
int count_one_bit( int n)  
{
	int count = 0;
	while (n)
	{
		n = n&(n - 1); //把最右边二进制1去掉
			count++;
		
	}
	return count;
}

int main()
{
	int num = 0;
	scanf("%d", &num);
	//求一个整数存储在内存中的二进制1的个数
	int n = count_one_bit(num);
	printf("%d\n", n);
	system("pause");
	return 0;
}